深入理解Java虚拟机(二)

垃圾收集器

1、垃圾收集器根据GC的分代策略也被用在不同的分代中:年轻代Serial、ParNew、Parallel Scavenge、GI)、老年代(CMS、Serial Old、Parallel Old、GI);其中GI收集器年轻代和老年代都可以使用。

先上图,他们之间的连线表示可以配合使用。


2、垃圾回收算法

      垃圾回收其实就是回收已经死掉没有用的对象实例。对于如何判定对象已死,主要有引用计数算法和可达性分析算法。

引用计数算法:给对象添加一个引用计数器,每当有一个地方引用它时,计数器就加1;当引用失效时,计数器减1,计数器为0的对象代表已经不被使用,即已死;优点:实现简单,效率快,缺点:很难解决对象之间的相互循环引用。

可达性分析算法:通过一系列的称为“GC Roots”的对象作为起始点,从这些节点朝下搜索,搜索所走过的路径称为引用连接,当一个对象到GC Roots 没有任何引用连接(当然java里又分为了强引用、软引用、弱引用和虚引用),即该对象到GC Roots 不可达,就代表该对象不可用(已死),java采用的就是可达性分析算法。


gc的回收算法主要有标记-清除算法、复制算法、标记-整理算法

标记-清除算法:基本算法,标记出需要回收的对象,之后统一回收所有被标记过的对象。缺点:标记和清除效率都不高;清除后产生大量不连续的内存碎片(如果碎片太多,在分配大对象时,无法获取足够的连续内存就会提前触发垃圾回收动作)。

复制算法:把内存分为大小相等的两块,每次只使用一个,当这个内存满了后,就把还存活的对象复制到另外一块内存空间中,然后把之前已使用满的那块全部清除掉。优点:实现简单、运行高效。缺点:吃内存,浪费了一半。(一般年轻代会采用该算法,但是不是分为1:1的比例划分内存空间,而是分成一个较大的Eden和两个较小的Survivor,一般比例是默认8:1,可通过jvm参数-XX:SurvivorRatio设置每次只使用Eden和其中一个Survivor,如果是8:1的话,就只浪费了10%的内存资源,是完全可以接受的)。

标记-整理算法:过程和标记-清除算法一样,但是最后不会清除,而是让存活的对象朝一边移动,然后清除掉边之外的内存。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值